package com.atguigu.redis_springboot;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

/**
 * 一、搭建基本环境
 * 1、导入数据库文件
 * 2、创建Javabean封装数据
 * 3、整合mybatis操作数据库
 * 		1、配置数据源信息
 * 		2、使用注解版的mybatis
 * 			1）@MapperScan指定需要扫描的mapper接口所在的包
 *  二、快速体验缓存
 *  	步骤:
 *  		1、开启基于注解的缓存
 *  		2、标注缓存注解即可
 * 				@Cacheable
 * 				@CacheEvict
 * 				@CachePut
 *  默认使用的是ConcurrentMapCacheManager==ConcurrentMapCache;将数据保存在ConcurrentMap<Object,Object>
 *  开发中使用缓存中间件:redis、memcached、ehcache;
 *	三、原理
 *		1、自动配置:CacheAutoConfiguration
 *		2、缓存配置类:
 *		   org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
 *		   org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration【默认】
 *		   org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration
 *		3、哪个配置类默认生效:SimpleCacheConfiguration
 *		4、SimpleCacheConfiguration作用:给容器注册了一个CacheManager:ConcurrentMapCacheManager
 *	 	5、ConcurrentMapCacheManager作用:可以获取和创建ConcurrentMapCache类型的缓存组件；他的作用是将数据保存在ConcurrentMap中；
 *
 *	 	运行流程（@Cacheable）:
 *	 	1、方法运行之前，先去查询Cache（缓存组件），按照cacheNames指定名称获取；
 *	 		（CacheManager先获取相应的缓存），第一次获取缓存，如果没有cache组件会自动创建。
 *	 	2、去Cache中查找缓存的内容，使用一个参数，默认就是方法的参数；
 *	 		 key是按照某种策略生成的；默认是使用keyGenerator生成的，默认使用SimpleKeyGenerator生成key；
 *	 		 	SimpleKeyGenerator生成key的默认策略:
 *	 		 		如果没有参数：key=new SimpleKey()；
 *	 		 		如果有一个参数：key=参数的值；
 *	 		 		如果有多个参数：key=new SimpleKey(params)；
 *	 	3、没有查到缓存就调用目标方法；
 *	    4、将目标方法的返回结果，放进缓存中
 *
 * 		@Cacheable 标注的方法执行之前先来检查缓存中有没有这个数据，默认按照参数的值作为key去查询缓存，
 * 		如果没有就运行方法并将结果放入缓存；以后再来调用就可以直接使用缓存中的数据；
 *
 * 		核心：
 * 			1)使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件
 * 			2)key使用keyGenerator生成的，默认是SimpleKeyGenerator
 * 	四、整合redis作为缓存
 * 	Redis是一个开源的，内存中的数据结构存储系统，它可以作为数据库、缓存和消息中间件。
 * 		1、安装Redis
 * 		2、引入Redis的starter
 * 		3、配置Redis
 * 		4、测试缓存
 * 			原理:CacheManager===Cache 缓存组件来实际给缓存中存取组件
 * 			1)引入redis的starter,容器中保存的是 RedisCacheManager
 * 			2)RedisCacheManager 帮我们创建 RedisCache 来作为缓存组件，RedisCache通过操作redis来缓存数据
 * 			3)默认保存数k-y都是Object；利用序列化保存；如何保存json
 * 					1、引入redis的starter，CacheManager 变为 RedisCacheManager
 * 					2、默认创建的RedisCacheManager 操作redis的时候使用的是 RedisTemplate<Object,Object>
 * 					3、RedisTemplate<Object,Object>默认使用JDK的序列化机制
 * 			4)自定义CacheManager:
 */
@MapperScan("com.atguigu.redis_springboot.mapper")
@SpringBootApplication
@EnableCaching
public class RedisSpringbootApplication {

	public static void main(String[] args) {
		SpringApplication.run(RedisSpringbootApplication.class, args);
	}

}
